/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package co.com.claro.administracionSolicitudes.entity;

import java.io.Serializable;
import java.util.List;
import javax.persistence.Basic;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.validation.constraints.Size;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlTransient;

/**
 *
 * @author Mike
 */
@Entity
@Table(name = "USUARIO")
@XmlRootElement
@NamedQueries({
    @NamedQuery(name = "Usuario.findAll", query = "SELECT u FROM Usuario u"),
    @NamedQuery(name = "Usuario.findByIdUsuario", query = "SELECT u FROM Usuario u WHERE u.idUsuario = :idUsuario"),
    @NamedQuery(name = "Usuario.findByNombres", query = "SELECT u FROM Usuario u WHERE LOWER(u.nombres) LIKE :nombres"),
    @NamedQuery(name = "Usuario.findByApellidos", query = "SELECT u FROM Usuario u WHERE LOWER(u.apellidos) LIKE :apellidos"),
    @NamedQuery(name = "Usuario.findByNumeroDocumento", query = "SELECT u FROM Usuario u WHERE u.numeroDocumento = :numeroDocumento AND u.activo = :activo AND u.estado = :estado"),
    @NamedQuery(name = "Usuario.findByCorreo", query = "SELECT u FROM Usuario u WHERE u.correo = :correo"),
    @NamedQuery(name = "Usuario.findByEstado", query = "SELECT u FROM Usuario u WHERE u.estado = :estado"),
    @NamedQuery(name = "Usuario.findUsuarioByExactUsername", query = "SELECT u FROM Usuario u WHERE LOWER(u.username) = :username AND u.activo = :activo AND u.estado = :estado"),
    @NamedQuery(name = "Usuario.findByPassword", query = "SELECT u FROM Usuario u WHERE u.password = :password"),
    @NamedQuery(name = "Usuario.findByTelefono", query = "SELECT u FROM Usuario u WHERE u.telefono = :telefono"),
    @NamedQuery(name = "Usuario.findByExtension", query = "SELECT u FROM Usuario u WHERE u.extension = :extension"),
    @NamedQuery(name = "Usuario.findByTelefonoPersonal", query = "SELECT u FROM Usuario u WHERE u.telefonoPersonal = :telefonoPersonal"),
    @NamedQuery(name = "Usuario.findUsuarioByUsername", query = "SELECT u FROM Usuario u WHERE LOWER(u.username) LIKE :username AND u.activo = :activo AND u.estado = :estado"),
    @NamedQuery(name = "Usuario.findUsuarioByGerenciaAndGrupo", query = "SELECT u FROM Usuario u JOIN u.grupoList g WHERE u.gerencia = :gerencia AND (g.idGrupo = :ejecutor OR g.idGrupo = :administrador) AND u.activo = :activo"),
    @NamedQuery(name = "Usuario.findUsuarioByGerencia", query = "SELECT u FROM Usuario u WHERE u.gerencia = :gerencia AND u.activo = :activo"),
    @NamedQuery(name = "Usuario.findUsuarioByGerenciaAndUsername", query = "SELECT u FROM Usuario u WHERE u.gerencia = :gerencia AND LOWER(u.username) = :username AND u.activo = :activo"),
    @NamedQuery(name = "Usuario.findUsuarioByGerenciaAndNumeroDocumento", query = "SELECT u FROM Usuario u WHERE u.gerencia = :gerencia AND u.numeroDocumento = :numeroDocumento AND u.activo = :activo"),
    @NamedQuery(name = "Usuario.findUsuariosByNombreApellido", query = "SELECT u FROM Usuario u WHERE LOWER(u.nombres) LIKE :nombres AND LOWER(u.apellidos) LIKE :apellidos"),
    @NamedQuery(name = "Usuario.findUsuarioActivoById", query = "SELECT u FROM Usuario u WHERE u.idUsuario = :idUsuario AND u.activo = :activo")
})
public class Usuario extends EntidadBase implements Serializable {

    @OneToMany(cascade = {CascadeType.MERGE, CascadeType.PERSIST}, mappedBy = "idUsuarioActual", fetch = FetchType.LAZY)
    private List<UsuarioTemporal> usuarioTemporalList;
    @Basic(optional = false)
    @Column(name = "USUARIO_RED")
    private short usuarioRed;
    @OneToMany(cascade = {CascadeType.MERGE, CascadeType.PERSIST}, mappedBy = "idUsuario", fetch = FetchType.LAZY)
    private List<UsuariosPorAplicaciones> usuariosPorAplicacionesList;
    @Basic(optional = false)
    @Column(name = "ACTIVO")
    private short activo;
    @OneToMany(mappedBy = "idEjecutor", fetch = FetchType.LAZY)
    private List<Solicitud> solicitudList;
    @OneToMany(cascade = {CascadeType.MERGE, CascadeType.PERSIST}, mappedBy = "idSolicitante", fetch = FetchType.LAZY)
    private List<Solicitud> solicitudList1;
    @JoinColumn(name = "GERENCIA", referencedColumnName = "ID_GERENCIA")
    @ManyToOne(optional = false)
    private Gerencia gerencia;
    @ManyToMany(mappedBy = "usuarioList", fetch = FetchType.LAZY)
    private List<Grupo> grupoList;
    private static final long serialVersionUID = 1L;
    @Id
    @Basic(optional = false)
    @Column(name = "ID_USUARIO")
    @SequenceGenerator(name = "seqUsuario", sequenceName = "USUARIO_SEQ", allocationSize = 1)
    @GeneratedValue(strategy = GenerationType.AUTO, generator = "seqUsuario")
    private Integer idUsuario;
    @Basic(optional = false)
    @Size(min = 1, max = 200)
    @Column(name = "NOMBRES")
    private String nombres;
    @Basic(optional = false)
    @Size(min = 1, max = 200)
    @Column(name = "APELLIDOS")
    private String apellidos;
    @Basic(optional = false)
    @Column(name = "NUMERO_DOCUMENTO")
    private long numeroDocumento;
    @Basic(optional = false)
    @Size(min = 1, max = 250)
    @Column(name = "CORREO")
    private String correo;
    @Basic(optional = false)
    @Column(name = "ESTADO")
    private short estado;
    @Basic(optional = false)
    @Size(min = 1, max = 75)
    @Column(name = "USERNAME")
    private String username;
    @Size(min = 1, max = 75)
    @Column(name = "PASSWORD")
    private String password;
    @Size(max = 15)
    @Column(name = "TELEFONO")
    private String telefono;
    @Size(max = 6)
    @Column(name = "EXTENSION")
    private String extension;
    @Size(max = 15)
    @Column(name = "TELEFONO_PERSONAL")
    private String telefonoPersonal;
    @JoinColumn(name = "TIPO_EMPLEADO", referencedColumnName = "ID_TIPO_EMPLEADO")
    @ManyToOne(optional = false)
    private TipoEmpleado tipoEmpleado;
    @JoinColumn(name = "TIPO_DOCUMENTO", referencedColumnName = "ID_TIPO_DOCUMENTO")
    @ManyToOne(optional = false)
    private TipoDocumento tipoDocumento;
    @JoinColumn(name = "EMPRESA", referencedColumnName = "ID_EMPRESA")
    @ManyToOne
    private Empresa empresa;
    @JoinColumn(name = "CIUDAD", referencedColumnName = "ID_CIUDAD")
    @ManyToOne(optional = false)
    private Ciudad ciudad;
    @JoinColumn(name = "CARGO", referencedColumnName = "ID_CARGO")
    @ManyToOne(optional = false)
    private Cargo cargo;
    @OneToMany(mappedBy = "idUsuarioCertificador", fetch = FetchType.LAZY)
    private List<CertificacionUsuario> certificacionUsuarioList;

    public Usuario() {
    }

    public Usuario(Integer idUsuario) {
        this.idUsuario = idUsuario;
    }

    public Usuario(Integer idUsuario, String nombres, String apellidos, long numeroDocumento, String correo, short estado, String username, String password) {
        this.idUsuario = idUsuario;
        this.nombres = nombres;
        this.apellidos = apellidos;
        this.numeroDocumento = numeroDocumento;
        this.correo = correo;
        this.estado = estado;
        this.username = username;
        this.password = password;
    }

    public Integer getIdUsuario() {
        return idUsuario;
    }

    public void setIdUsuario(Integer idUsuario) {
        this.idUsuario = idUsuario;
    }

    public String getNombres() {
        return nombres;
    }

    public void setNombres(String nombres) {
        this.nombres = nombres;
    }

    public String getApellidos() {
        return apellidos;
    }

    public void setApellidos(String apellidos) {
        this.apellidos = apellidos;
    }

    public Long getNumeroDocumento() {
        return numeroDocumento;
    }

    public void setNumeroDocumento(Long numeroDocumento) {
        this.numeroDocumento = numeroDocumento;
    }

    public String getCorreo() {
        return correo;
    }

    public void setCorreo(String correo) {
        this.correo = correo;
    }

    public short getEstado() {
        return estado;
    }

    public void setEstado(short estado) {
        this.estado = estado;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getTelefono() {
        return telefono;
    }

    public void setTelefono(String telefono) {
        this.telefono = telefono;
    }

    public String getExtension() {
        return extension;
    }

    public void setExtension(String extension) {
        this.extension = extension;
    }

    public String getTelefonoPersonal() {
        return telefonoPersonal;
    }

    public void setTelefonoPersonal(String telefonoPersonal) {
        this.telefonoPersonal = telefonoPersonal;
    }

    public TipoEmpleado getTipoEmpleado() {
        return tipoEmpleado;
    }

    public void setTipoEmpleado(TipoEmpleado tipoEmpleado) {
        this.tipoEmpleado = tipoEmpleado;
    }

    public TipoDocumento getTipoDocumento() {
        return tipoDocumento;
    }

    public void setTipoDocumento(TipoDocumento tipoDocumento) {
        this.tipoDocumento = tipoDocumento;
    }

    public Empresa getEmpresa() {
        return empresa;
    }

    public void setEmpresa(Empresa empresa) {
        this.empresa = empresa;
    }

    public Ciudad getCiudad() {
        return ciudad;
    }

    public void setCiudad(Ciudad ciudad) {
        this.ciudad = ciudad;
    }

    public Cargo getCargo() {
        return cargo;
    }

    public void setCargo(Cargo cargo) {
        this.cargo = cargo;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (idUsuario != null ? hash * 37 + idUsuario.hashCode() : 0);
        hash += (gerencia != null ? hash * 37 + gerencia.hashCode() : 0);
        hash += (hash * 37 + usuarioRed);
        hash += (hash * 37 + activo);
        hash += (nombres != null ? hash * 37 + nombres.hashCode() : 0);
        hash += (apellidos != null ? hash * 37 + apellidos.hashCode() : 0);
        hash += (hash * 37 + numeroDocumento);
        hash += (correo != null ? hash * 37 + correo.hashCode() : 0);
        hash += (hash * 37 + estado);
        hash += (username != null ? hash * 37 + username.hashCode() : 0);
        hash += (password != null ? hash * 37 + password.hashCode() : 0);
        hash += (telefono != null ? hash * 37 + telefono.hashCode() : 0);
        hash += (telefonoPersonal != null ? hash * 37 + telefonoPersonal.hashCode() : 0);
        hash += (tipoEmpleado != null ? hash * 37 + tipoEmpleado.hashCode() : 0);
        hash += (tipoDocumento != null ? hash * 37 + tipoDocumento.hashCode() : 0);
        hash += (empresa != null ? hash * 37 + empresa.hashCode() : 0);
        hash += (ciudad != null ? hash * 37 + ciudad.hashCode() : 0);
        hash += (cargo != null ? hash * 37 + cargo.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        if (!(object instanceof Usuario)) {
            return false;
        }
        Usuario other = (Usuario) object;
        return (this.usuarioRed == other.usuarioRed)
                && (this.activo == other.activo)
                && (this.numeroDocumento == other.numeroDocumento)
                && (this.estado == other.estado)
                && (this.idUsuario != null || other.idUsuario == null) && (this.idUsuario == null || this.idUsuario.equals(other.idUsuario))
                && (this.gerencia != null || other.gerencia == null) && (this.gerencia == null || this.gerencia.equals(other.gerencia))
                && (this.nombres != null || other.nombres == null) && (this.nombres == null || this.nombres.equals(other.nombres))
                && (this.apellidos != null || other.apellidos == null) && (this.apellidos == null || this.apellidos.equals(other.apellidos))
                && (this.correo != null || other.correo == null) && (this.correo == null || this.correo.equals(other.correo))
                && (this.username != null || other.username == null) && (this.username == null || this.username.equals(other.username))
                && (this.password != null || other.password == null) && (this.password == null || this.password.equals(other.password))
                && (this.telefono != null || other.telefono == null) && (this.telefono == null || this.telefono.equals(other.telefono))
                && (this.extension != null || other.extension == null) && (this.extension == null || this.extension.equals(other.extension))
                && (this.telefonoPersonal != null || other.telefonoPersonal == null) && (this.telefonoPersonal == null || this.telefonoPersonal.equals(other.telefonoPersonal))
                && (this.tipoEmpleado != null || other.tipoEmpleado == null) && (this.tipoEmpleado == null || this.tipoEmpleado.equals(other.tipoEmpleado))
                && (this.tipoDocumento != null || other.tipoDocumento == null) && (this.tipoDocumento == null || this.tipoDocumento.equals(other.tipoDocumento))
                && (this.empresa != null || other.empresa == null) && (this.empresa == null || this.empresa.equals(other.empresa))
                && (this.cargo != null || other.cargo == null) && (this.cargo == null || this.cargo.equals(other.cargo))
                && (this.grupoList != null || other.grupoList == null) && (this.grupoList == null || this.grupoList.equals(other.grupoList));
    }

    @Override
    public String toString() {
        return "co.com.claro.adminSolicitudes.entities.Usuario[ idUsuario=" + idUsuario + " ]";
    }

    @XmlTransient
    public List<Grupo> getGrupoList() {
        return grupoList;
    }

    public void setGrupoList(List<Grupo> grupoList) {
        this.grupoList = grupoList;
    }

    public Usuario(Integer idUsuario, String apellidos, String nombres, int numeroDocumento, String correo, short estado) {
        this.idUsuario = idUsuario;
        this.apellidos = apellidos;
        this.nombres = nombres;
        this.numeroDocumento = numeroDocumento;
        this.correo = correo;
        this.estado = estado;
    }

    @Override
    public String obtenerNombreClase() {
        return "Usuario";
    }

    @XmlTransient
    public List<Solicitud> getSolicitudList() {
        return solicitudList;
    }

    public void setSolicitudList(List<Solicitud> solicitudList) {
        this.solicitudList = solicitudList;
    }

    @XmlTransient
    public List<Solicitud> getSolicitudList1() {
        return solicitudList1;
    }

    public void setSolicitudList1(List<Solicitud> solicitudList1) {
        this.solicitudList1 = solicitudList1;
    }

    @XmlTransient
    public List<CertificacionUsuario> getCertificacionUsuarioList() {
        return certificacionUsuarioList;
    }

    public void setCertificacionUsuarioList(List<CertificacionUsuario> certificacionUsuarioList) {
        this.certificacionUsuarioList = certificacionUsuarioList;
    }

    public Gerencia getGerencia() {
        return gerencia;
    }

    public void setGerencia(Gerencia gerencia) {
        this.gerencia = gerencia;
    }

    public short getActivo() {
        return activo;
    }

    public void setActivo(short activo) {
        this.activo = activo;
    }

    @XmlTransient
    public List<UsuariosPorAplicaciones> getUsuariosPorAplicacionesList() {
        return usuariosPorAplicacionesList;
    }

    public void setUsuariosPorAplicacionesList(List<UsuariosPorAplicaciones> usuariosxaplicacionesList) {
        this.usuariosPorAplicacionesList = usuariosxaplicacionesList;
    }

    public short getUsuarioRed() {
        return usuarioRed;
    }

    public void setUsuarioRed(short usuarioRed) {
        this.usuarioRed = usuarioRed;
    }

    @XmlTransient
    public List<UsuarioTemporal> getUsuarioTemporalList() {
        return usuarioTemporalList;
    }

    public void setUsuarioTemporalList(List<UsuarioTemporal> usuarioTemporalList) {
        this.usuarioTemporalList = usuarioTemporalList;
    }

}
